﻿using System;
using NHibernate.Mapping.Attributes;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;


namespace VemTransporte.Models.Basica
{
    [DataContract]
    [KnownType(typeof(Usuario))]
    [Class(Table = "Usuario", Lazy = true)]
    public class Usuario
    {
        #region Atributos
        private int id;
        private string nome;
        private DateTime nascimento;
        private string sexo;
        private string email;
        private string senha;
        private string deOnde;
        private string paraOnde;
        private string motivo;        
        private double latitude; 
        private double longitude;
        
        private Endereco _endereco;
        private IList<UsuarioLinha> _UsuarioLinhas;
        #endregion

        #region Propriedades
        [DataMember]
        [Id(Name = "Id", Column = "PK_IdUsuario")]
        [Generator(1, Class = "native")]
        public virtual int Id
        {
            get { return id; }
            set { id = value; }
        }

        [DataMember]
        [Property(Column = "USU_Nome")]
        public virtual string Nome
        {
            get { return nome; }
            set { nome = value; }
        }

        [DataMember]
        [Property(Column = "USU_Nascimento")]
        public virtual DateTime Nascimento
        {
            get { return nascimento; }
            set { nascimento = value; }
        }

        [DataMember]
        [Property(Column = "USU_Sexo")]
        public virtual string Sexo
        {
            get { return sexo; }
            set { sexo = value; }
        }

        /// <summary>
        /// Email será o login do usuário
        /// </summary>
        [DataMember]
        [Property(Column = "USU_Email")]
        public virtual string Email
        {
            get { return email; }
            set { email = value; }
        }

        [DataMember]
        [Property(Column = "USU_Senha")]
        public virtual string Senha
        {
            get { return senha; }
            set { senha = value; }
        }

        [DataMember]
        [Property(Column = "USU_DeOnde")]
        public virtual string DeOnde
        {
            get { return deOnde; }
            set { deOnde = value; }
        }

        [DataMember]
        [Property(Column = "USU_ParaOnde")]
        public virtual string ParaOnde
        {
            get { return paraOnde; }
            set { paraOnde = value; }
        }

        [DataMember]
        [Property(Column = "USU_Motivo")]
        public virtual string Motivo
        {
            get { return motivo; }
            set { motivo = value; }
        }

        [DataMember]
        [Property(Column = "USU_Latitude")]
        public virtual double Latitude
        {
            get { return latitude; }
            set { latitude = value; }
        }

        [DataMember]
        [Property(Column = "USU_Longitude")]
        public virtual double Longitude
        {
            get { return longitude; }
            set { longitude = value; }
        }

        [ManyToOne(Column = "FK_IdEndereco", ClassType = typeof(Endereco), Fetch = FetchMode.Join)]
        public virtual Endereco Endereco
        {
            get { return _endereco; }
            set { _endereco = value; }
        }

        [Bag(Fetch = CollectionFetchMode.Join, Cascade = "all-delete-orphan", Inverse = true)]
        [Key(1, Column = "FK_IdUsuario")]
        [OneToMany(2, ClassType = typeof(UsuarioLinha))]
        public virtual IList<UsuarioLinha> UsuarioLinhas
        {
            get { return _UsuarioLinhas; }
            set { _UsuarioLinhas = value; }
        }

        public virtual void AddUsuarioLinha(UsuarioLinha usuarioLinha)
        {
            usuarioLinha.Usuario = this;
            this._UsuarioLinhas.Add(usuarioLinha);
        }
        #endregion

        #region Contrutores
        public Usuario() { }
        #endregion

        #region Functions
        #endregion
    }
}